package de.dis2011.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import de.dis2011.data.DB2ConnectionManager;

/**
 * Makler-Bean
 * 
 * Beispiel-Tabelle: CREATE TABLE makler(id INTEGER NOT NULL GENERATED ALWAYS AS
 * IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE) PRIMARY KEY, name
 * varchar(255), address varchar(255), login varchar(40) UNIQUE, password
 * varchar(40));
 */
public class Makler
{
    private int id = -1;
    private String name;
    private String addresse;
    private String login;
    private String password;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getAddresse()
    {
        return addresse;
    }

    public void setAddresse(String addresse)
    {
        this.addresse = addresse;
    }

    public String getLogin()
    {
        return login;
    }

    public void setLogin(String login)
    {
        this.login = login;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    /**
     * Lädt einen Makler aus der Datenbank
     * 
     * @param id
     *            ID des zu ladenden Maklers
     * @return Makler-Instanz
     */
    public static Makler load(int id)
    {
        try
        {
            // Hole Verbindung
            Connection con = DB2ConnectionManager.getInstance().getConnection();

            // Erzeuge Anfrage
            String selectSQL = "SELECT * FROM makler WHERE id = ?";
            PreparedStatement pstmt = con.prepareStatement(selectSQL);
            pstmt.setInt(1, id);

            // Führe Anfrage aus
            ResultSet rs = pstmt.executeQuery();
            if (rs.next())
            {
                Makler ts = new Makler();
                ts.setId(id);
                ts.setName(rs.getString("name"));
                ts.setAddresse(rs.getString("addresse"));
                ts.setLogin(rs.getString("login"));
                ts.setPassword(rs.getString("password"));

                rs.close();
                pstmt.close();
                return ts;
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Speichert den Makler in der Datenbank. Ist noch keine ID vergeben worden,
     * wird die generierte Id von DB2 geholt und dem Model übergeben.
     */
    public void save()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Füge neues Element hinzu, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                // Achtung, hier wird noch ein Parameter mitgegeben,
                // damit spC$ter generierte IDs zurC<ckgeliefert werden!
                String insertSQL = "INSERT INTO makler(name, adresse, login, passwort) VALUES (?, ?, ?, ?)";

                PreparedStatement pstmt = con.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);

                // Setze Anfrageparameter und fC<hre Anfrage aus
                pstmt.setString(1, getName());
                pstmt.setString(2, getAddresse());
                pstmt.setString(3, getLogin());
                pstmt.setString(4, getPassword());
                pstmt.executeUpdate();

                // Hole die Id des engefC<gten Datensatzes
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next())
                {
                    setId(rs.getInt(1));
                }

                rs.close();
                pstmt.close();
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE makler SET name = ?, adresse = ?, login = ?, passwort = ? WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setString(1, getName());
                pstmt.setString(2, getAddresse());
                pstmt.setString(3, getLogin());
                pstmt.setString(4, getPassword());
                pstmt.setInt(5, getId());
                pstmt.executeUpdate();

                pstmt.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void delete()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht gelöscht werden");
            }
            else
            {
                String deleteSQL = "DELETE FROM makler WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(deleteSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void edit()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht geändert werden");
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE makler SET name = ?, adresse = ?, login = ?, passwort = ? WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setString(1, getName());
                pstmt.setString(2, getAddresse());
                pstmt.setString(3, getLogin());
                pstmt.setString(4, getPassword());
                pstmt.setInt(5, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}
